package key

import (
	library ".."
	"../log"
	"./uuid"
)

// Log 全局日志
var Log = log.GetLog("library")

// Key 管理
type Key struct {
	TimeID   int64
	UserList map[string]*Info
}

// Init 初始化
func (K *Key) Init() {
	K.UserList = make(map[string]*Info)
	// 超时处理
	K.TimeID = library.Cycle.ADD(1000, func() {
		for id, I := range K.UserList {
			// 计时
			if I.LifeCycle > 0 {
				I.LifeCycle--
				continue
			}
			// 销毁
			if I.LifeCycle == 0 {
				delete(K.UserList, id)
			}
		}
	})
}

// Add 添加
func (K *Key) Add() (*Info, string) {
	id := uuid.Rand().Hex()
	K.UserList[id] = &Info{}
	K.UserList[id].Privilege = make(map[string]bool)
	return K.UserList[id], id
}

// Get 获取
func (K *Key) Get(id string) (*Info, bool) {
	key, ok := K.UserList[id]
	if ok {
		if key.LifeCycle == 0 {
			return key, false
		}
		return key, true
	}
	return key, false
}

// IfKey 判断Key
func (K *Key) IfKey(v map[string]interface{}, name string) (Fk *Info, Fb bool) {
	// 得到 key 参数
	if k, ok := v[name]; ok {
		// 参数适应
		switch str := k.(type) {
		case []string:
			Fk, Fb = K.UserList[str[0]]
			if Fb {
				if Fk.LifeCycle == 0 {
					Fb = false
				}
			}
		case string:
			Fk, Fb = K.UserList[str]
			if Fb {
				if Fk.LifeCycle == 0 {
					Fb = false
				}
			}
		default:
			Log.WarnS("Key 解析失败")
		}
	} else {
		Log.WarnS("Key 参数错误")
	}
	return
}

// Delete 删除
func (K *Key) Delete(id string) {
	if _, ok := K.UserList[id]; ok {
		delete(K.UserList, id)
	}
}

// Info Key信息
type Info struct {
	Key       string          // 用户标记(Key)用于数据库索引
	LifeCycle int64           // 生命周期 (-1 长期有效 0 等待回收 0 < 生命周期内)/秒
	Privilege map[string]bool // 授权信息
}

// GetPrivilege 得到授权信息
func (K *Info) GetPrivilege(name string) bool {
	// 得到 key 参数
	if P, ok := K.Privilege[name]; ok {
		return P
	}
	return false
}
